package com.atguigu.tingshu.search.service;

import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.model.search.SuggestIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface SearchService {


    /**
     * 将指定专辑封装专辑索引库文档对象，完成文档信息
     * @param albumId
     */
    void upperAlbum(Long albumId);


    /**
     * 将指定专辑从索引库删除
     * @param albumId
     */
    void lowerAlbum(Long albumId);

    /**
     * 专辑站内检索
     * @param albumIndexQuery 查询条件：关键字，分类，标签  分页参数 排序字段
     * @return
     */
    AlbumSearchResponseVo search(AlbumIndexQuery albumIndexQuery);

    /**
     * 基于入参查询条件构建完整检索请求对象
     * @param albumIndexQuery 查询条件
     * @return 检索请求对象
     */
    SearchRequest buildDSL(AlbumIndexQuery albumIndexQuery);

    /**
     * 解析ES响应结果，将ES响应JSON转为AlbumSearchResponseVo对象
     *
     * @param searchResponse  ES响应结果
     * @param albumIndexQuery
     * @return
     */
    AlbumSearchResponseVo parseResult(SearchResponse<AlbumInfoIndex> searchResponse, AlbumIndexQuery albumIndexQuery);

    /**
     * 查询指定1级分类下置顶7个三级分类下热门专辑前6
     * @param category1Id 一级分类ID
     * @return [{"baseCategory3":"分类信息","list":[{热门专辑}]}]
     */
    List<Map<String, Object>> getTopCategoryAlbumList(Long category1Id);

    /**
     * 根据用户正在录入文本进行自动联想
     * @param keyword 任意字符
     * @return 用于自动补全文本列表
     */
    List<String> completeSuggest(String keyword);


    /**
     * 解析自定义建议词结果
     * @param suggestName 自定义建议词参数名称
     * @param searchResponse ES响应结果
     * @return
     */
    Collection<String> parseSuggestResult(String suggestName, SearchResponse<SuggestIndex> searchResponse);

    /**
     * 更新Redis所有1级分类不同排序TOP10专辑
     */
    void updateLatelyAlbumRanking();

    /**
     * 根据分类以及排序方式获取top10专辑列表
     * @param category1Id
     * @param dimension
     * @return
     */
    List<AlbumInfoIndex> getRankingList(Long category1Id, String dimension);
}
